#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

//非阻塞轮询
int main()
{
    pid_t id=fork();
    if(id<0){
        perror("fork");
        return 1;
    }
    else if(id==0)
    {//子进程
        int cnt=30;
        while(cnt)
        {

        printf("I am child, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
        cnt--;
        sleep(1);
        }
        exit(0);
    }
    else{//父进程
        int cnt=5;
        while(cnt)
        {
            printf("I am father, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
            cnt--;
            sleep(1);
        }

        int status=0;
        while(1){
       pid_t ret=waitpid(id,&status,WNOHANG);
        if(ret>0)
        {
            printf("wait success, ret: %d, exit sig:%d,exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
            if(WIFEXITED(status))
            {
                printf("进程是正常跑完的，退出码为:%d\n",WEXITSTATUS(status));
            }
            else{
                printf("进程出异常了\n");
            }
            break;
        }
        else if(ret<0)
        {
            printf("wait failed!\n");
            break;
        }
        else{//ret==0
            printf("子进程还没退出，我在等等吧...\n");
            sleep(1);
        }
    }
    }
    return 0;
}


//for(int i=0;i<N;i++)
//{
//    pit_t id=wait(NULL);
//    if(id>0)
//    {
//        printf("wait %d success\n",id);
//    }
//}
//

//wait与waitpid演示
//int main()
//{
//    pid_t id=fork();
//    if(id<0){
//        perror("fork");
//        return 1;
//    }
//    else if(id==0)
//    {//子进程
//        int cnt=5;
//        while(cnt)
//        {
//
//        printf("I am child, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
//        cnt--;
//        sleep(1);
//        }
//        exit(0);
//    }
//    else{//父进程
//        int cnt=10;
//        while(cnt)
//        {
//            printf("I am father, pid:%d, ppid:%d, cnt:%d\n",getpid(),getppid(),cnt);
//            cnt--;
//            sleep(1);
//        }
//
//        int status=0;
//       // pid_t ret=wait(NULL);
//       pid_t ret=waitpid(id,&status,0);
//        if(ret==id)
//        {
//           // printf("wait success, ret: %d\n",ret);
//            printf("wait success, ret: %d, exit sig:%d,exit code:%d\n",ret,status&0x7F,(status>>8)&0xFF);
//        }
//        sleep(5);
//    }
//    return 0;
//}
